package com.itheima.controller;

import com.itheima.result.R;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.time.LocalDateTime;
import java.util.UUID;

@RestController
@RequestMapping("/common")
public class CommonController {

    @Value("${reggie.path}")
    private String Path;
    /**
     * 文件上传
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public R upload(MultipartFile file) throws IOException {
        //1.file是临时文件，要找个地方储存起来，否则本次请求结束后，就会被删除
        //2.由于可能会有很多用户上传图片，为了避免文件名重复导致被覆盖，因此，我们保持后缀名的同时，给文件重新命名

        //2.1拿到原始文件名
        String originalFilename = file.getOriginalFilename();
        //2.2拿到后缀名
        String lastname = originalFilename.substring(originalFilename.lastIndexOf("."));

        //2.3生成一个随机数
        UUID uuid = UUID.randomUUID();

        //2.4拼接新名字
        String filename = uuid + lastname;

        //3.定义储存位置，
        //3.1为了防止文件夹内东西太多，我们大多会选择按照时间来分层定义文件夹，用来储存不同时间接收的文件
        LocalDateTime time = LocalDateTime.now();
        int year = time.getYear();
        int month = time.getMonthValue();
        int day = time.getDayOfMonth();

        //3.2,拼接储存位置
        String FileLocation = year+"/"+month+"/"+day+"/"+filename;

        //3.3转为file对象
        File lastFilePath = new File(Path+"/"+FileLocation);

        //3.4 判断文件夹是否存在,不存在就创建
        File parentFile = lastFilePath.getParentFile();
        if (!parentFile.exists()){
            parentFile.mkdirs();
        }

        //4.转存文件
        file.transferTo(lastFilePath);
        //5.返回文件名称
        return R.success(FileLocation);
    }

    /**
     * 文件下载
     * @param name
     * @return
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse resp) throws IOException {
        //1.通过Path+name定位到要读取的文件，输入流（读）：文件内容读取到内存    输出流：往外写
        //创建读取流
        FileInputStream fileInputStream = new FileInputStream(new File(Path + name));

        //2.通过浏览器的输出流，写回给浏览器
        //2.1创建流
        ServletOutputStream outputStream = resp.getOutputStream();

        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = fileInputStream.read(bytes)) != -1){
            outputStream.write(bytes,0,len);
            outputStream.flush();
        }
        //关闭资源
        outputStream.close();
        fileInputStream.close();
    }
}
